💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    숫자와 문자열의 다양한 기능 | ✅저자: 이유정(박사)

    🔹 format() 함수란?

    현업 개발자들은 문자열 안에 변수나 값을 깔끔하게 삽입할 때 
    format() 함수를 매우 자주 사용합니다. 코드 가독성을 높이고,복잡한 
    문자열을 쉽게 조합할 수 있도록 해주기 때문입니다.
    
    특히 사용자 입력값이나 변수들을 설명 문장에 포함시킬 때 연산자 대신
    format( )을 사용하는 습관을 들이면 코드 관리가 훨씬 쉬워집니다.
    
    항목 설명
    기능 문자열 안에 값을 깔끔하게 삽입하는 함수입니다.
    사용법 "문장 안에 {}로 자리 표시" .format(값들) 형태로 사용합니다.
    특징 .format() 안에 적은 값들이, 왼쪽 문자열에 있는 {} 에 순서대로 들어갑니다.
    현업 용어 ... "string formatting", "문자열 포맷팅" 이라고 부릅니다.
    </> 예시코드: 기본 사용법 (위치지정방식)
    	name = "Eunice"
    	age = 25
    		
    	print("이름: {}, 나이: {}".format(name, age))
    

    🖨️ 출력결과:

    이름: Eunice, 나이: 25
    

    🔍 해설: {}는 값을 넣을 자리 표시자(placeholder)입니다. .format(name, age)를 통해 nameage가 각각 첫 번째 {}, 두 번째 {} 자리에 자동 삽입됩니다. 순서에 따라 변수들이 빈칸에 들어가므로 추가 가공 없이 깔끔한 출력이 가능합니다.

    💬 보충설명: 스퀘어브라켓: [ ] 리스트생성, 인덱싱과 슬라이싱, 딕셔너리 키 접근 커리브라켓: { } 딕셔너리 생성, 집합생성, f-string에서 변수 삽입, format() 메서드의 치환 필드지정 등에 사용됩니다. 라운드브라켓: ( ) 함수정의 호출, 튜플(tuple)생성, 연산 우선훈위 지정, 조건문등.


    📝 문제1] 숫자 두 개를 문자열로 합쳐 출력하기, 단 format( )사용하기 숫자 57을 이용해 "5 + 7 = 12" 형태로 출력하세요.

    a = 5 
    b = 7 
    
    print("{ } + { } = { }".format(a, b, a + b))
    

    🖨️ 출력 결과:

    5 + 7 = 12
    

    📝 문제2] 문자열과 변수 함께 출력하기 이름이 "지민"이고 나이가 20살일 때, "지민님의 나이는 20살입니다." 를 출력하세요.

    name = "지민"
    age = 20
    
    print("{ }님의 나이는 { }살입니다.".format(name, age))
    

    📝 문제3] 사용자 입력으로 문장 만들기 사용자에게 과일 이름과 개수를 입력받아 "사과를 3개 샀어요." 처럼 출력하세요.

    ✅ 정답 코드:

    fruit = input("과일 이름: ")    # 예: 사과
    count = input("개수: ")         # 예: 3
    
    print(fruit)
    print(count)
    print("{}를 {}개 샀어요.".format(fruit, count))
    
    

    🖨️ 출력 결과:

    과일 이름: 사과 
    개수: 3 
    사과를 3개 샀어요.
    

    ◽ 위치 지정과 키워드 인자 사용:
    {0}, {1} 위치 지정: {} 대신 {0}, {1}  처럼 인덱스를 지정할 수 있음
    키워드 인자 사용: format(name="홍길동", age=20)처럼 이름을 지정하
    여 넣을 수도 있습니다.
    

    </> 예시코드: 위치 지정 예시

    name = "지민"
    age = 20
    
    print("{1}가 {0}살입니다.".format(20, "Eunice"))
    

    🖨️ 출력 결과:

    Eunice가 25살입니다.
    

    </> 예시코드: 키워드 인자 예시

    print("{name}님의 나이는 {age}살입니다.".format(name="지민", age=20))
    

    🖨️ 출력 결과:

    지민님의 나이는 20살입니다.
    

    IndexError 예외
    format( ) 함수를 사용할 때 { } 자리의 개수와 .format( ) 안에 
    들어가는 값의 개수가 맞지 않으면  IndexError가 발생합니다.
    
    • { } 개수보다 .format( )의 값이 적으면 에러가 발생합니다.
    • 즉, 포맷에 들어갈 변수가 부족하거나 초과될 때 발생하는 오류입니다.

    현업에서도 자주 발생하는 실수 중 하나로, format( )을 사용하실 때 반드시 자리와 값을 확인하는 습관을 들이시는 것이 좋습니다.

    항목 설명
    오류 이름 IndexError
    발생 원인 {} 자리표시자와 .format()의 값 개수가 맞지 않을 때 발생
    해결 방법 {}의 개수와 .format() 안의 값 개수를 동일하게 맞추어야 함
    현업 용어 "format index error", "자리 표시자 불일치 에러" 등으로 표현함
    💬 보충설명:
    `IndexError`는 말 그대로 인덱스(순서)에 관련된 오류로,  
    실제 값보다 요청한 자릿수{  }가 더 많을 때 주로 발생합니다.
    

    </> 예시코드: 기본 오류 발생 예시

    print("이름: {}, 나이: {}, 지역: {}".format("유정", 25))  
    # ❌ 지역 값이 빠졌습니다.
    

    ❌ 🖨️ 출력 결과: 에러 메시지:

    IndexError: Replacement index 2 out of range for positional args tuple
    

    🔍 해설: 문자열에 {}가 총 3개 있지만, .format()에 제공된 값은 2개("유정", 25)뿐이므로 세 번째 {}에 들어갈 값이 없습니다. 이로 인해 IndexError가 발생한 것입니다.

    💬 보충설명:
    반대로, {}보다 .format()에 제공된 값이 많으면 에러는 나지 않지만,
    불필요하게 입력한 값은 무시됩니다. 이것도 현업에서 코드 리뷰 시 주의해야 하는 부분입니다.


    🔹 format( ) 함수의 다양한 기능

    ◽ 정수 출력의 다양한 형태 파이썬의 format() 함수를 사용하면 정수를 다양한 형태로 출력할 수 있습니다. 예를 들어, 다음과 같은 형식을 지정할 수 있습니다:

    • 10진수: 기본 정수 출력
    • 16진수: 주로 메모리 주소나 색상 코드 등을 표현할 때 사용
    • 8진수: 파일 시스템의 퍼미션을 설정할 때 사용할 수 있습니다.
    • 2진수: 비트 레벨의 연산을 설명할 때 사용

    </> 예시코드:

    	number = 255
    
    	# 10진수 출력
    	print("basic": {}".format(number)) 
    	# 범용 출력(정수, 실수, 문자열 모두 가능)
    	
    	print("Decimal: {:d}".format(number)) 
    	# 정수(10진수)출력 전용
    	
    	# 16진수 출력
    	print("Hexadecimal: {:x}".format(number))
    	
    	# 8진수 출력
    	print("Octal: {:o}".format(number))
    	
    	# 2진수 출력
    	print("Binary: {:b}".format(number))
    

    🖨️ 출력 결과:

    	Decimal: 255
    	Decimal: 255
    	Hexadecimal: ff
    	Octal: 377
    	Binary: 11111111
    

    🔍 해설: 위의 코드는 255라는 정수를 10진수, 16진수, 8진수, 2진수로 변환하여 출력합니다. 각 형식 지정자(d,x, o, b)는 정수를 해당 진법으로 변환하여 문자열로 반환합니다.

    💬 보충설명: format() 함수 안에서 {:d},{:x}, {:o}, {:b} 같은 걸 형식 지정자(format specifier) 라고합니다. 이건 “출력할 때 어떤 모양으로 보여줄까?” 를 정하는 명령어 같은 기호예요.

    ❌ TypeError 발생 사례

    	print("{:d}".format("10")) # 문자열을 넣으면 에러
    	print("{:d}".format(3.14)) # 실수에 쓰면 에러(정수전용)
    

    ◽ 정수 출력의 형식 지정자 정리
    형식 지정자 의미 예시 코드 출력 결과 해설
    {:d} 10진수 출력 {:d} 255 정수 그대로 출력
    {:b} 2진수(binary) 출력 {:b} 11111111 컴퓨터가 이해하는 0과 1
    {:o} 8진수(octal) 출력 {:o} 377 주로 파일 퍼미션 표시 등에 사용
    {:x} 16진수(hex) 출력 - 소문자 {:x} ff 색상코드 등에 사용, 소문자 출력
    {:X} 16진수(hex) 출력 - 대문자 {:X} FF 대문자 버전 (예: 0xFF)
    {:05d} 0으로 채워진 5자리 정수 출력 {:05d} 00255 자릿수 맞추기용, 숫자 앞에 0 채움
    {:<5d} 왼쪽 정렬 후 5자리 공간 확보 {:<5d} 255xx 글자 왼쪽 정렬 (오른쪽은 공백)
    {:>5d} 오른쪽 정렬 후 5자리 공간 확보 {:>5d} xx255 글자 오른쪽 정렬 (왼쪽은 공백)
    {:^5d} 가운데 정렬 후 5자리 공간 확보 {:^5d} x255x 글자를 가운데 정렬
    • 숫자 앞뒤로 x는 공백을 의미합니다.

    </> 예시코드:

    number = 255
    
    print("10진수: {:d}".format(number))     # 일반적인 정수 출력
    print("2진수: {:b}".format(number))      # 2진수 출력
    print("8진수: {:o}".format(number))      # 8진수 출력
    print("16진수(소문자): {:x}".format(number))  # 16진수 (소문자)
    print("16진수(대문자): {:X}".format(number))  # 16진수 (대문자)
    
    print("0으로 채우기: {:05d}".format(number)) # 5자리, 앞을 0으로 채움
    print("왼쪽 정렬: {:<5d}".format(number))     # 왼쪽 정렬
    print("오른쪽 정렬: {:>5d}".format(number))   # 오른쪽 정렬
    print("가운데 정렬: {:^5d}".format(number))   # 가운데 정렬
    

    🖨️ 출력 결과:

    	10진수: 255
    	2진수: 11111111
    	8진수: 377
    	16진수(소문자): ff
    	16진수(대문자): FF
    	0으로 채우기: 00255
    	왼쪽 정렬: 255  
    	오른쪽 정렬:   255
    	가운데 정렬:  255 
    

    ◽ 부동 소수점 출력의 다양한 형태
    부동 소수점 수는 소수점을 포함하는 실수를 표현할 때 사용됩니다. 
    format() 함수를 이용하면 소수점 이하의 정밀도를 지정하거나 
    과학적 표기법을 사용할 수 있습니다.
    

    </> 예시코드:

    	number = 1234.56789
    	
    	# 기본형은 소수점 아래 6자리까지 표현
    	print("default: {:f}".format(number))
    	
    	# 소수점 아래 두 자리까지 표현
    	print("Fixed point: {:.2f}".format(number))
    	
    	# 과학적 표기법
    	print("Scientific: {:.2e}".format(number))
    

    🖨️ 출력 결과:

    default: 1234.567890
    Fixed point: 1234.57
    Scientific: 1.23e+03
    

    🔍 해설: 위의 코드는 1234.56789라는 부동 소수점 수를 소수점 아래 두 자리로 반올림하거나 과학적 표기법으로 표현합니다. {:.2f}는 고정 소수점 형식으로 소수점 아래 두 자리까지 표시하고, {:.2e}는 과학적 표기법으로 표시합니다.


    ◽ 의미 없는 소수점 제거
    부동 소수점 수에서 값이 정수일 때 소수점을 출력하지 않도록 하려면
    format() 함수를 사용하여 조건적으로 포맷팅할 수 있습니다.
    

    </> 예시코드:

    	number = 1234.0
    
    	# 소수점 이하가 의미 없을 때 제거
    	print("No meaningless decimal: {:.0f}".format(number))
    

    🖨️ 출력 결과:

    	No meaningless decimal: 1234
    

    🔍 해설: 위의 코드에서 {:.0f} 형식 지정자는 소수점 이하를 출력하지 않습니다. 이는 주로 사용자 인터페이스에서 정수값을 깔끔하게 표시하고자 할 때 유용합니다.


    🔹 문자열 관련 메서드 총정리

    🔹 문자열 조사 및 판별 메서드
    문자열이 특정한 형식이나 조건을 만족하는지 판단해주는 도구로,
    문자열이 "어떤 종류의 문자들로만 이루어져 있는가?",  
    또는 "특정한 형태로 시작하거나 끝나는가?"를 참(True) 또는 
    거짓(False)으로 알려주는 기능이에요.
    

    📘 사용 목적: 입력값이 문자만 있는지, 숫자인지, 대소문자 구성이 맞는지, 공백만 있는지등 조건 검사를 자동으로 해주는 편리한 도구입니다. 사용자 입력을 검증하거나 문자열의 형태를 확인할 때 자주 사용됩니다.

    메서드 설명 예시
    isalpha() 문자로만 구성되었는가 "abc".isalpha()True
    isdigit() 숫자로만 구성되었는가 "123".isdigit()True
    isalnum() 알파벳 또는 숫자로만 구성 "abc123".isalnum()True<br>"www".isalnum()True`
    islower() 모두 소문자인가 "hello".islower()True
    isupper() 모두 대문자인가 "HELLO".isupper()True
    isspace() 공백으로만 구성 " ".isspace()True
    istitle() 제목 형식인가 (각 단어 첫 글자 대문자) "Hello World".istitle()True
    startswith(substr) 지정 문자열로 시작하는가 "hello".startswith("he")True
    endswith(substr) 지정 문자열로 끝나는가 "hello".endswith("lo")True
    </> 예시코드:
    # isalpha()
    print("abc".isalpha())         # True
    print("한글".isalpha())        # True
    print("abc123".isalpha())      # False
    
    # isdigit()
    print("123".isdigit())         # True
    print("12a3".isdigit())        # False
    
    # isalnum()
    print("abc123".isalnum())      # True
    print("www".isalnum())         # True (특수문자 공백 제외하고  True)
    print("abc 123".isalnum())     # False  (공백 포함)
    
    # islower()
    print("hello".islower())       # True
    print("Hello".islower())       # False
    
    # isupper()
    print("HELLO".isupper())       # True
    print("Hello".isupper())       # False
    
    # isspace()
    print("     ".isspace())       # True
    print("  \t\n  ".isspace())    # True
    print("  a  ".isspace())       # False
    
    # istitle()
    print("Hello World".istitle()) # True
    print("hello world".istitle()) # False
    
    # startswith()
    print("hello".startswith("he"))  # True
    print("hello".startswith("lo"))  # False
    
    # endswith()
    print("hello".endswith("lo"))    # True
    print("hello".endswith("he"))    # False
    

    ◽ 문자열 조사 및 판별 메서드: 웹 개발, 데이터 처리, 사용자 입력 검증등에 활용되며 사용 예 및 활용 맥락은 다음과 같다:

    1️⃣ startswith(substr)
    → 문자열이 특정 문자열로 시작하는지 확인 (URL, 로그 등에서 매우 자주 사용)

    2️⃣ endswith(substr)
    → 문자열이 특정 문자열로 끝나는지 확인 (파일 확장자, 로그 포맷 등에서 활용)

    3️⃣ isdigit()
    → 숫자만 포함되어 있는지 확인 (나이, 금액 등 사용자 입력 검증 시 자주 사용)

    4️⃣ isalnum()
    → 영문자 또는 숫자로만 구성되어 있는지 확인 (아이디, 비밀번호 등 유효성 검사)

    5️⃣ isalpha()
    → 영문자 또는 한글만 포함되었는지 확인 (이름 등 검증 시 활용)

    6️⃣ isspace()
    → 공백 문자만 포함되어 있는지 확인 (데이터 클렌징, 전처리 시 사용)

    7️⃣ islower()
    → 모든 문자가 소문자인지 확인 (텍스트 정규화, NLP 분야에서 사용됨)

    8️⃣ isupper()
    → 모든 문자가 대문자인지 확인 (강조 텍스트 필터링 등 일부 경우)

    9️⃣ istitle()
    → 문자열이 제목 형식인지 확인 (문장 스타일 체크 시 사용 빈도 낮음)


    📖 문법, 구문(syntax):

    문자열.startswith(찾을_문자열[, 시작인덱스[, 끝인덱스]])
    

    ◽ 매개변수: 찾을_문자열: 문자열이 이 값으로 시작하는지 확인 시작인덱스: (선택) 시작 위치 지정 끝인덱스: (선택) 끝 위치 지정

    </>예시코드: 문자열이 특정 접두사로 시작하는지 확인

    url = "https://openai.com"
    
    if url.startswith("https://"):
        print("보안 연결된 URL입니다.")
    else:
        print("비보안 URL입니다.")
    

    🖨️ 출력 결과:

    보안 연결된 URL입니다.
    

    🔍 해설:

    • startswith("https://")는 문자열이 "https://"로 시작하면 True를 반환합니다.
    • 실제 웹개발에서 URL 유효성 검사 시 자주 사용됩니다.

    📖 endswith(substr) 문법, 구문(syntax):

    문자열.endswith("확인할_문자열"[, 시작인덱스[, 끝인덱스]])
    

    ◽ 매개변수: 확인할_문자열: "문자열" 이 이 값으로 끝나는지 확인합니다 시작인덱스: (선택) 시작 위치 지정 끝인덱스: (선택) 끝 위치 지정

    </>예시코드: 이미지 파일 필터링

    filename = "holiday_photo.png"
    
    if filename.endswith(".png"):
        print("PNG 이미지 파일입니다.")
    else:
        print("다른 형식의 파일입니다.")
    

    🖨️ 출력 결과:

    PNG 이미지 파일입니다.
    

    🔍 해설:

    • "holiday_photo.png".endswith(".png")True를 반환하므로 if 블록이 실행됩니다.
    • endswith()는 문자열이 특정 확장자로 끝나는지 확인할 때 매우 유용합니다.

    📝 문제1] 사용자로부터 입력 받은 문자열이 알파벳으로만 구성되어 있고, 모두 소문자인지 확인하세요.

    ✨ 힌트: isalpha()islower()를 동시에 사용해야 합니다. 사용자가 입력한 문자가 숫자, 공백, 특수문자가 섞이면 False가 됩니다.

    ✅ 정답 코드:

    text = input("소문자 알파벳만 입력하세요:")
    result = text.isalpha() and text.islower()
    print("소문자 알파벳으로만 구성됐나요?", result)
    

    🖨️ 출력 결과:

    소문자 알파벳으로만 구성됐나요? True
    

    🔍 해설:

    • isalpha()는 입력한 문자열이 알파벳(문자)만으로 이루어졌는지 확인합니다.
      → 숫자, 공백, 특수문자가 섞이면 False가 됩니다.
    • islower()는 입력한 문자열이 모두 소문자인지 확인합니다.
      → 대문자가 하나라도 있으면 False입니다.
    • and는 두 조건이 모두 True일 때만 True를 반환합니다.

    ✅ 예: hello → True / Hello → False / hello123 → False


    📝 문제2] 문자열 "DATA2025!"이 알파벳 또는 숫자로만 되어 있는지 확인하세요.

    ✨ 힌트: isalnum()은 알파벳 + 숫자 조합이면 True 특수문자(!, @, 등)가 섞이면 False

    ✅ 정답 코드:

    text = "DATA2025!"
    print("알파벳 또는 숫자로만 구성됐나요?", text.isalnum())
    

    🖨️ 출력 결과:

    알파벳 또는 숫자로만 구성됐나요? False
    

    🔍 해설:

    • isalnum()는 문자열이 알파벳 또는 숫자만으로 구성됐는지 확인합니다.
      → 공백, 느낌표 !, 기타 특수문자가 들어가면 False가 됩니다.
    • "DATA2025!"에는 느낌표 !가 포함되어 있으므로 False가 출력됩니다.

    ✅ 예: Data2025 → True / DATA2025! → False


    📝 문제3] 사용자로부터 입력 받은 문자열이 공백만으로 구성되어 있는지와 동시에 탭 또는 줄바꿈 문자가 포함되어 있는지를 확인하세요.

    ✨ 힌트: isspace()는 공백, 탭(\t), 줄바꿈(\n)을 포함하면 True "\t\n "True로 평가됨

    ✅ 정답 코드:

    text = input("공백, 탭, 줄바꿈만 입력하세요: ")
    print("공백 문자만 포함됐나요?", text.isspace())
    

    🖨️ 출력 결과:

    공백 문자만 포함됐나요? True
    

    🔍 해설:

    • isspace()는 문자열이 오로지 공백 문자(스페이스, 탭, 줄바꿈)로만 구성되었는지를 확인합니다.
      • 공백 " "
      • "\t"
      • 줄바꿈 "\n"
        이 세 가지가 혼합되어 있어도 True가 됩니다.
    • 문자나 숫자가 하나라도 섞이면 False가 됩니다.

    ✅ 예: " \t\n" → True / " \t1" → False


    📝 문제4] 문자열 " Python3 "에서 좌우 공백을 제거한 후, 알파벳과 숫자로만 구성되어 있는지 확인하세요.

    ✨ 힌트: strip()으로 공백 제거 후 isalnum()으로 검사

    🖨️ 출력 결과:

    알파벳 또는 숫자로만 구성됐나요? True
    

    ✅ 정답 코드:

    text = "  Python3 "
    cleaned = text.strip()
    print("알파벳 또는 숫자로만 구성됐나요?", cleaned.isalnum())
    

    🔍 해설:

    • 문자열 양쪽에 있는 공백 " "strip()을 사용해서 제거합니다.
    • "Python3"가 되면, 이건 알파벳과 숫자의 조합이므로 isalnum()은 True를 반환합니다.
    • 만약 공백을 제거하지 않으면 " Python3 "는 공백이 포함되어 있어서 isalnum()은 False가 됩니다.

    ✅ 예: " Python3 " → True (공백 제거 후)


    📝 문제5] 문자열 "Hello World"를 소문자로 바꾼 후, 완전히 소문자로만 구성되어 있는지 확인하세요.

    ✨ 힌트: lower()로 소문자로 만든 후 islower() 사용 공백은 영향을 주지 않음

    ✅ 정답 코드:

    text = "Hello World"
    lowered = text.lower()
    print("완전히 소문자인가요?", lowered.islower())
    

    🖨️ 출력 결과:

    완전히 소문자인가요? True
    

    🔍 해설:

    • lower()는 문자열의 모든 알파벳을 소문자로 바꿉니다.
    • islower()는 문자열이 소문자로만 구성되어 있는지 확인합니다.
    • 공백 " "은 소문자도 대문자도 아니므로 검사에서 제외됩니다.
      → 즉, hello world처럼 되어 있으면 islower()는 True를 반환합니다.

    ✅ 예: "Hello World"lower() 후 → "hello world" → True


    📝 문제6] 사용자 ID 형식 검사하기

    # 문제설명
    사용자에게 아이디를 입력받아, 다음 조건을 만족하는지 검사하세요:
    
    1. 아이디는 영문 또는 숫자로만 구성되어야 한다.
    2. 아이디는 대문자가 포함되면 안 된다.
    
    조건을 만족하면 "사용자 등록 가능"을, 하나라도 어기면 "잘못된 아이디 형식"을 출력하세요.
    

    🌟 힌트: isalnum() → 문자와 숫자로만 되어 있는지 판별 islower() → 입력된 모든 문자가 소문자인지 판별 두 조건을 동시에 만족해야 등록 가능

    🖨️ 출력 예시:

    아이디를 입력하세요: john123
    사용자 등록 가능
    

    ✅ 정답 코드:

    user_id = input("아이디를 입력하세요: ")
    
    if user_id.isalnum() and user_id.islower():
        print("사용자 등록 가능")
    else:
        print("잘못된 아이디 형식")
    

    📝 문제7] 문장 입력 시 제목 형식인지 검사하기

    # 문제 설명
    사용자에게 문장을 입력받아, 각 단어의 첫 글자가 대문자인 "제목 형식"인지 검사하세요.
    
    - 제목 형식이면: "올바른 제목입니다."
    - 아니면: "제목 형식이 아닙니다." 를 출력하세요.
    

    🌟 힌트: istitle()은 "The Great Escape"처럼 각 단어의 첫 글자만 대문자이면 True를 반환함 전체 대문자("THE GREAT ESCAPE")나 전체 소문자("the great escape")는 False가 됨

    🖨️ 출력 예시:

    제목을 입력하세요: The Great Escape
    올바른 제목입니다.
    

    ✅ 정답 코드:

    title = input("제목을 입력하세요: ")
    
    if title.istitle():
        print("올바른 제목입니다.")
    else:
        print("제목 형식이 아닙니다.")
    

    🔹 문자열 변경 (새 문자열 반환)
    문자열의 모양을 바꾸거나, 특정 문자를 교체하거나, 공백이나 형식을 
    다듬는 데 사용되는 문자열 가공 도구들입니다.
    즉, "문자열을 그대로 두지 않고 변형하거나 정리하는 작업을 자동으로 
    처리"해 줍니다.
    
    메서드 설명 예시
    lower() 모두 소문자로 "HELLO".lower()"hello"
    upper() 모두 대문자로 "hello".upper()"HELLO"
    capitalize() 첫 글자만 대문자 "hello world".capitalize()"Hello world"
    title() 각 단어 첫 글자 대문자 "hello world".title()"Hello World"
    swapcase() 대소문자 뒤집기 "Hello".swapcase()"hELLO"
    strip() 양쪽 공백 제거 " hi ".strip()"hi"
    lstrip() 왼쪽 공백 제거 " hi".lstrip()"hi"
    rstrip() 오른쪽 공백 제거 "hi ".rstrip()"hi"
    replace(a, b) 문자열 교체 "apple".replace("p", "b")"abble"
    zfill(width) 0으로 채워 고정 길이 만들기 "42".zfill(5)"00042"
    </> 예시코드:
    # lower()
    print("HELLO".lower())            # hello
    
    # upper()
    print("hello".upper())            # HELLO
    
    # capitalize() 
    print("hello world".capitalize()) # Hello world
    # → 문장의 첫 글자만 대문자, 나머지는 소문자 
    
    # title()
    print("hello world".title())      # Hello World
    # → 각 단어의 첫 글자가 대문자
    
    # swapcase() 
    print("Hello".swapcase())         # hELLO
    # → 대소문자 뒤집기 (A ↔ a)  
    
    # strip()
    print("  hi  ".strip())           # hi
    # → 앞뒤 공백 모두 제거
    
    # lstrip() 
    print("  hi".lstrip())            # hi
    # 엘스트립
    
    # rstrip()
    print("hi  ".rstrip())            # hi
    
    # replace("p", "b")
    print("apple".replace("p", "b"))  # abble
    
    # zfill(5) 
    print("42".zfill(5))              # 00042
    # → 전체 길이를 5로 만들고, 부족한 앞자리에 0을 채움 
    

    📝 문제 1] 사용자 입력 정리 및 검증

    사용자로부터 이름을 입력받습니다.
    다음 조건을 만족하면 "등록 완료", 아니면 "형식 오류"를 출력하세요:

    • 이름의 앞뒤 공백을 제거하고(strip())
    • 모든 문자가 소문자여야 하고(islower())
    • 길이가 3글자 이상이어야 함

    🌟 힌트: strip()으로 공백 제거 후 islower()len()을 사용하세요.

    🖨️ 출력 예시:

    입력:   john  
    출력: 등록 완료
    

    ✅ 정답 코드:

    name = input("이름을 입력하세요: ").strip()
    
    if name.islower() and len(name) >= 3:
        print("등록 완료")
    else:
        print("형식 오류")
    

    🔍 해설: " john ""john" → 소문자이며 길이 4 → 조건 통과


    📝 문제 2] 비밀번호 포맷 처리 비밀번호는 숫자 문자열로 구성됩니다. 사용자가 "42"를 입력하면, 길이가 6이 되도록 앞을 0으로 채운 문자열을 출력하세요.

    🖨️ 출력 예시:

    입력: 42
    출력: 000042
    

    ✅ 정답 코드:

    password = input("숫자 비밀번호를 입력하세요: ")
    print(password.zfill(6))
    

    🔍 해설: "42".zfill(6)"000042"


    📝 문제 3] 문장 스타일 변환기 문장 "hello world"를 아래 형식으로 출력해보세요:

    • 각 단어 첫 글자만 대문자 (title())
    • 대소문자를 반전시킨 형태 (swapcase())

    🖨️ 출력 결과:

    hELLO wORLD
    

    ✅ 정답 코드:

    text = "hello world"
    step1 = text.title()       # "Hello World"
    step2 = step1.swapcase()   # "hELLO wORLD"
    print(step2)
    

    🔍 해설:

    • title()"Hello World"
    • swapcase()"hELLO wORLD"

    📝 문제 4] 잘못된 단어 교정 다음 문장 "apple pen pineapple pen"에서 "pen""PEN"으로 교체한 뒤,
    전체 문장을 대문자로 출력하세요.

    🌟 힌트:

    • replace()"pen" → "PEN"
    • 그다음 upper()로 전체 대문자 처리

    🖨️ 출력 결과:

    APPLE PEN PINEAPPLE PEN
    

    ✅ 정답 코드:

    text = "apple pen pineapple pen"
    replaced = text.replace("pen", "PEN")
    print(replaced.upper())
    

    🔍 해설:

    • "pen""PEN"
    • 이후 전체 대문자 처리: "APPLE PEN PINEAPPLE PEN"

    📝 문제 5] 사용자 메시지 포맷팅 사용자로부터 메시지를 입력받아 다음 조건으로 정리하여 출력하세요:

    • 앞뒤 공백 제거 (strip())
    • 첫 글자만 대문자로 (capitalize())
    • "badword"가 포함되어 있다면 "****"로 대체 (replace())

    🌟 힌트: 순서 중요: 먼저 공백 제거 → 단어 필터링 → 문장 형태 정리

    🖨️ 출력 예시:

    입력:   badword is not allowed    
    출력: **** is not allowed
    

    ✅ 정답 코드:

    message = input("메시지를 입력하세요: ").strip()
    message = message.replace("badword", "****")
    print(message.capitalize())
    

    🔍 해설:

    • 공백 제거 후 "badword""****"로 바꾸고
    • capitalize()로 문장 형태로 정리

    🔹 문자열 나누기와 결합
    문자열을 특정 기준(구분자)으로 잘라서 나누거나, 여러 조각(리스트)을
    다시 하나의 문자열로 합치는 기능을 합니다.
    
    메서드 설명 예시
    split() 공백 기준 나누기 "a b c".split()['a', 'b', 'c']
    split(',') 쉼표 기준 나누기 "a,b,c".split(',')['a', 'b', 'c']
    rsplit() 오른쪽부터 나누기 "a b c".rsplit(' ', 1)['a b', 'c']
    partition() 처음 나오는 구분자 기준으로 분리 (3개 튜플 반환) "user:pass".partition(":")('user', ':', 'pass')
    join(list) 리스트를 문자열로 결합 ",".join(['a', 'b'])"a,b"
    </> 예시코드
    # split() - 공백 기준 나누기
    text1 = "a b c"
    print(text1.split())  
    # 출력: ['a', 'b', 'c']
    # 설명: 공백을 기준으로 문자열을 나누면 각각 리스트 항목이 됨
    
    # split(',') - 쉼표 기준 나누기
    text2 = "a,b,c"
    print(text2.split(','))  
    # 출력: ['a', 'b', 'c']
    # 설명: 쉼표를 기준으로 나누기. 데이터 파일(CSV 등)에 자주 사용됨
    
    # rsplit(' ', 1) - 오른쪽에서 1번만 나누기
    text3 = "a b c"
    print(text3.rsplit(' ', 1))  
    # 출력: ['a b', 'c']
    # 설명: 오른쪽에서 한 번만 공백을 기준으로 나눠서 두 조각으로 분리
    
    # partition(':') - 가장 먼저 나오는 : 기준으로 3부분 나누기 (튜플)
    text4 = "user:pass"
    print(text4.partition(":"))  
    # 출력: ('user', ':', 'pass')
    # 설명: 첫 번째 ':' 기준으로 앞, 구분자, 뒤를 튜플로 나눔
    
    # join() - 리스트를 문자열로 결합
    list1 = ['a', 'b']
    print(",".join(list1))  
    # 출력: "a,b"
    # 설명: 리스트의 요소를 쉼표로 연결하여 하나의 문자열로 만듦
    

    ◽ 문자열 나누기와 결합 메서드 활용: 1️⃣ 데이터 분리: 이름, 이메일, 날짜처럼 한 줄에 묶인 데이터를 나눌 때

    2️⃣ 파일 처리: CSV 파일 등에서 쉼표로 구분된 항목을 나눌 때

    3️⃣ 사용자 입력 분석: 띄어쓰기, 쉼표, 콜론 등으로 입력값을 쪼갤 때

    4️⃣ 출력 형식 제어: 리스트나 결과를 문자열로 깔끔하게 합칠 때


    📝 문제 1] 공백으로 분리한 후 결합하기 사용자 입력 "one two three"를 공백 기준으로 나눈 뒤,
    리스트로 만든 후 각 단어를 하이픈(-)으로 연결된 문자열로 출력하세요.

    🖨️ 출력 결과:

    ['one', 'two', 'three']
    one-two-three
    

    ✅ 정답 코드:

    text = "one two three"
    words = text.split()
    result = "-".join(words)
    print(words)
    print(result)
    

    🔍 해설: "one two three".split()['one', 'two', 'three'] '-'.join(...)으로 하이픈 연결


    📝 문제 2] 이메일 아이디와 도메인 분리하기

    • 이메일 "user01@gmail.com"을 데이터를
    • 아이디만 출력되도록 하세요.

    🖨️ 출력 결과:

    user01
    

    ✅ 정답 코드:

    email = "user01@gmail.com"
    id_part = email.partition("@")[0]
    print(id_part)
    

    🔍 해설: partition("@")('user01', '@', 'gmail.com') [0] 번째 인덱스가 아이디 부분

    split()은 리스트 [ ] partition()은 튜플을 반환합니다. ( )


    📝 문제 3] ## 쉼표로 구분된 문자열을 오른쪽에서만 1번 나누기 문자열 "apple,banana,grape"를 오른쪽 쉼표 기준으로 1번만 나눠서 앞부분과 뒷부분을 리스트로 출력하세요.

    🌟 힌트:

    • rsplit(',', 1) 사용

    🖨️ 출력결과:

    ['apple,banana', 'grape']
    

    ✅ 정답 코드:

    fruits = "apple,banana,grape"
    result = fruits.rsplit(',', 1)
    print(result)
    

    🔍 해설: 오른쪽에서 1번만 나눔 → 앞은 "apple,banana", 뒤는 "grape"


    📝 문제 4] ## 문자열에서 마지막 단어만 추출하기 문자열 "Learn Python Programming"에서 가장 마지막 단어만 출력하세요.

    🌟 힌트:

    • rsplit(' ', 1)을 사용해서 뒤에서 나누기

    🖨️ 출력 결과:

    Programming
    

    ✅ 정답 코드:

    text = "Learn Python Programming"
    last_word = text.rsplit(' ', 1)[1]
    print(last_word)
    

    🔍 해설:

    • rsplit(' ', 1)['Learn Python', 'Programming']
    • [1] 번째가 마지막 단어

    📝 문제 5] 리스트를 문자열로 만들고, 다시 리스트로 만들기 리스트 ["red", "green", "blue"];로 연결해 문자열을 만들고,
    그 문자열을 다시 리스트로 복원해서 출력하세요.

    🌟 힌트:

    • join()으로 문자열 만들고, split()으로 다시 나눔

    🖨️ 출력 결과:

    red;green;blue
    ['red', 'green', 'blue']
    

    ✅ 정답 코드:

    colors = ["red", "green", "blue"]
    joined = ";".join(colors)
    restored = joined.split(";")
    print(joined)
    print(restored)
    

    🔍 해설:

    • join()"red;green;blue"
    • split(";") → 원래 리스트로 복원

    🔹 문자열 정렬
    center(), ljust(), rjust()는 문자열을 지정된 너비(width) 안에서
    가운데, 왼쪽, 오른쪽 중 원하는 위치로 정렬시켜주는 메서드입니다.
    부족한 공간은 공백(또는 원하는 문자)으로 채워집니다.
    즉, 문자열을 지정된 길이 안에서 보기 좋게 정렬하고, 빈 공간을 채워주
    는 도구입니다.
    
    메서드 설명 예시
    center(width) 가운데 정렬 "hi".center(5)" hi "
    ljust(width) 왼쪽 정렬 "hi".ljust(5)"hi "
    rjust(width) 오른쪽 정렬 "hi".rjust(5)" hi"
    </> 예시코드:
    # center(width) - 가운데 정렬
    text1 = "hi"
    print(text1.center(5))
    # 출력: " hi "
    # 설명: 문자열 'hi'를 너비 5에 맞춰 가운데 정렬 → 앞뒤로 공백이 추가됨
    
    # ljust(width) - 왼쪽 정렬
    text2 = "hi"
    print(text2.ljust(5))
    # 출력: "hi   "
    # 설명: 문자열 'hi'를 너비 5에 맞춰 왼쪽 정렬 → 오른쪽에 공백이 생김
    
    # rjust(width) - 오른쪽 정렬
    text3 = "hi"
    print(text3.rjust(5))
    # 출력: "   hi"
    # 설명: 문자열 'hi'를 너비 5에 맞춰 오른쪽 정렬 → 왼쪽에 공백이 생김
    

    ◽ 문자열 정렬 메서드 활용 1️⃣ 표 형태의 출력 정렬 : 데이터를 보기 좋게 나열할 때 사용 (예: 이름, 점수, 금액 등 출력 정렬) 2️⃣ 간단한 텍스트 UI 만들기 제목 가운데 정렬, 표 제목 꾸미기 등 3️⃣ 문자열 채우기 작업 숫자/문자 길이를 맞춰 일정한 출력 형식 만들기


    📝 문제 1] 제목 가운데 정렬하기 문자열 "Chapter 1"을 너비 20으로 설정하여 가운데 정렬된 형태로 출력하세요. 단, 빈 공간은 "-" 문자로 채우세요.

    🌟 힌트: center()는 공백 대신 다른 문자로도 채울 수 있습니다.
    text.center(너비, 채울문자) 형태 사용

    🖨️ 출력 결과:

    -----Chapter 1------
    

    ✅ 정답 코드:

    title = "Chapter 1" 
    print(title.center(20, "-"))
    

    🔍 해설:

    • "Chapter 1" 길이 9 → 총 20자리 중 남는 11칸
    • 왼쪽에 5개, 오른쪽에 6개 -로 채워짐

    📝 문제 2] 오른쪽 정렬로 금액 정렬하기 다음 금액 리스트에서 각 항목을 오른쪽 정렬하여 아래와 같이 출력되도록 하세요.

         3500
         200
        10000
    

    🌟 힌트:

    • 각 숫자를 문자열로 변환한 뒤, rjust()로 너비 6~7 정도로 맞추기

    ✅ 정답 코드:

    prices = [3500, 200, 10000] 
    
    for price in prices:     
    	print(str(price).rjust(6))
    

    🖨️ 출력 결과:

      3500
       200
     10000
    

    🔍 해설:

    • 숫자를 문자열로 바꾼 후 rjust(6) → 6자리 안에서 오른쪽 정렬됨

    📝 문제 3] 좌우 여백을 포함한 꾸민 메시지 출력 문자열 "Welcome"을 왼쪽 정렬(ljust()), 오른쪽 정렬(rjust()), 가운데 정렬(center())로 각각 너비 20에 맞춰 꾸며서 다음과 같이 출력되게 하세요.

    Welcome             
                 Welcome
           Welcome       
    

    🌟 힌트:

    • 각 정렬 메서드에 너비 20을 지정하면 됩니다.
    • 공백은 기본값으로 자동 채워짐

    ✅ 정답 코드:

    text = "Welcome"
    print(text.ljust(20))
    print(text.rjust(20))
    print(text.center(20))
    

    🖨️ 출력 결과:

    Welcome             
                 Welcome
           Welcome  
    

    🔍 해설:

    • "Welcome"은 길이 7 → 나머지 칸을 공백으로 채워 각각 위치에 정렬됨
    • UI 출력, 표 꾸미기에 자주 사용되는 패턴

    🔹 문자열 찾기
    문자열 속에서 특정 문자가 어디에 있는지 찾거나, 몇 번 등장했는지를 
    확인할 수 있는 도구입니다.  
    즉, 문자열에서 특정 부분 문자열(단어, 문자 등)의 위치나 개수를 
    알려줍니다.
    
    메서드 설명 예시
    find(substr) 왼쪽부터 찾고 인덱스 반환 (없으면 -1) "apple".find("p")1
    rfind(substr) 오른쪽부터 찾고 인덱스 반환 "apple".rfind("p")2
    index(substr) find()와 같지만 없으면 오류 "apple".index("p")1
    count(substr) 부분 문자열 개수 "apple pie".count("p")2
    </> 예시코드:
    # find(substr) - 왼쪽부터 찾아 첫 번째 인덱스 반환, 없으면 -1
    text1 = "apple"
    result1 = text1.find("p")
    print(result1)
    # 출력: 1
    # 설명: 'p'가 처음 등장한 위치는 인덱스 1 (0부터 시작)
    
    # ❌실패
    result1_fail = text1.find("z")
    print(result1_fail)
    # 출력: -1
    # 설명: 'z'는 존재하지 않으므로 -1 반환
    
    
    # rfind(substr) - 오른쪽부터 찾아 첫 번째 인덱스 반환, 없으면 -1
    text2 = "apple"
    result2 = text2.rfind("p")
    print(result2)
    # 출력: 2
    # 설명: 오른쪽에서 찾기 때문에 두 번째 'p'(인덱스 2)가 반환됨
    
    # index(substr) - find()와 같지만, 못 찾으면 오류 발생
    text3 = "apple"
    result3 = text3.index("p")
    print(result3)
    # 출력: 1
    # 설명: 'p'가 처음 등장한 위치는 인덱스 1
    
    # ❌오류
    # result3_fail = text3.index("z")  # 주석 해제 시 오류 발생!
    # print(result3_fail)
    # 오류: ValueError: substring not found
    # 설명: 'z'는 없기 때문에 예외 발생 → find()와의 차이점
    
    # count(substr) - 특정 문자열이 몇 번 나오는지 개수 세기
    text4 = "apple pie"
    result4 = text4.count("p")
    print(result4)
    # 출력: 3
    # 설명: 'p'는 "apple pie"에 3번 등장함
    
    text4 = "apple pie"
    result4_none = text4.count("z")
    print(result4_none)
    # 출력: 0
    # 설명: 'z'는 등장하지 않음 → 0 반환 (오류 없음)
    

    📝 문제 1] 마지막으로 등장한 문자의 위치 찾기 문자열 "banana banana banana"에서 마지막으로 등장한 "b"의 위치를 구하세요.

    🌟 힌트:

    • rfind()오른쪽부터 탐색하여 가장 마지막에 나온 위치를 반환합니다.

    ✅ 정답 코드:

    text = "banana banana banana" 
    print(text.rfind("b"))
    

    🖨️ 출력 결과:

    14
    

    🔍 해설:

    • "b"는 세 번 등장하며, 마지막 "b""banana" 세 번째에서 시작 → 인덱스 14

    📝 문제 2] 특정 단어가 존재하는지 확인하고 처리하기 문자열 "access denied"에서 "success"라는 단어가 존재하지 않을 경우,
    "단어 없음"을 출력하고, 있을 경우 해당 인덱스를 출력하세요.

    🖨️ 출력 결과:

    단어 없음
    

    ✅ 정답 코드:

    text = "access denied" 
    index = text.find("success")  
    
    if index == -1:     
    	print("단어 없음") 
    else:     
    	print(index)
    

    🔍 해설:

    • "success"는 문자열에 없으므로 find()는 -1을 반환 → 조건문에서 걸러냄

    📝 문제 3] 문자열에서 단어의 개수 세기 문자열 "red, green, red, blue, red"에서 "red"라는 단어가 몇 번 나오는지 출력하세요.

    ◽ 보충설명: count()는 문자열 안에서 해당 단어가 몇 번 나오는지 알려줍니다.

    ✅ 정답 코드:

    colors = "red, green, red, blue, red" 
    print(colors.count("red"))
    

    🖨️ 출력 결과:

    3
    

    🔍 해설:

    • "red"는 총 3번 등장 → count("red")는 3 반환

    🔹 형식 지정
    형식 지정 메서드는 문자열 안에 {}를 넣고,  
    그 자리에 값을 자동으로 채워주는 문자열 기능이에요.
    
    메서드 설명 예시
    format() 문자열에 변수 삽입 "{}점입니다".format(100)"100점입니다"
    format_map(dict) 딕셔너리를 이용한 포맷 "{name}".format_map({"name": "Tom"})"Tom"
    ◽ format_map(dict)함수
    딕셔너리에서 키에 해당하는 값을 꺼내서,  문자열의 `{}` 자리에 채워주는 포맷팅 함수입니다.
    

    </>예시코드:

    info = {"name": "Tom", "age": 25}
    result = "이름: {name}, 나이: {age}".format_map(info)
    print(result)
    

    🖨️ 출력 결과

    이름: Tom, 나이: 25
    

    🔍 해설

    • {name}{age}는 비어 있는 자리(포맷 문자열)입니다.
    • format_map(info)는 딕셔너리 info에서 값을 찾아서 {name}"Tom", {age}25로 채워줍니다.
    • 딕셔너리에 키와 일치하는 항목이 없으면 오류가 발생하므로 주의해야 합니다.

    ◽ format_map( ) VS format( ) 차이점 format()은 자유도가 높고 다양한 인자 전달 가능,
    format_map()은 딕셔너리 하나로 빠르게 포맷할 때 유용.


    📝 문제 1] 사용자 정보 포맷 출력하기 딕셔너리 user = {"name": "Alice", "job": "Engineer"}를 이용하여
    문장 "이름: {name}, 직업: {job}"{} 부분을 format_map()으로 채워 출력하세요.

    🖨️ 출력 결과:

    이름: Alice, 직업: Engineer
    

    ✅ 정답 코드:

    user = {"name": "Alice", "job": "Engineer"} 
    
    sentence = "이름: {name}, 직업: {job}" 
    print(sentence.format_map(user))
    

    🔍 해설:

    • format_map()user 딕셔너리의 값을 가져와 {name}{job}에 각각 "Alice""Engineer"를 채워 넣습니다.

    📝 문제 2] 누락된 키에 대한 오류 상황 다루기 딕셔너리 data = {"title": "Python"}가 주어졌을 때,
    문장 "제목: {title}, 작성자: {author}"format_map()으로 출력하면 어떤 일이 발생할까요? 오류가 발생하는 이유와 함께, 이를 해결하는 방법을 작성하세요.

    🌟 힌트:

    • format_map(){} 안의 키가 딕셔너리에 없으면 KeyError를 발생시킵니다.
    • collections.defaultdict 또는 dict subclass를 활용하면 오류 없이 처리할 수 있습니다.

    🖨️ 출력 결과:

    제목: Python, 작성자: <author 없음>
    

    ✅ 정답 코드 (해결 방법 포함):

    class SafeDict(dict):     
    	def __missing__(self, key):         
    		return f"<{key} 없음>"  
    		
    data = {"title": "Python"} 
    template = "제목: {title}, 작성자: {author}" 
    
    print(template.format_map(SafeDict(data)))
    

    🔍 해설:

    • 원래는 KeyError: 'author'가 발생합니다.
    • SafeDict는 없는 키가 오면 <키 없음>으로 대신 채워주므로 오류 없이 출력됩니다.
    • 실무에서는 포맷 문자열에 누락 키가 있을 가능성이 있을 때 이렇게 처리합니다.

    🔹 인코딩
    encode()는 문자열(사람이 읽을 수 있는 글자)을 바이트(컴퓨터가 읽는
    숫자 코드)로 바꾸는 작업입니다.
    decode()는 바이트 데이터를 다시 문자열로 되돌리는 작업입니다.
    
    메서드 설명 예시
    encode() 문자열을 바이트로 인코딩 "한글".encode()b'\xed\x95\x9c\xea\xb8\x80'
    decode() 바이트를 문자열로 디코딩 b'\xed\x95\x9c\xea\xb8\x80'.decode()"한글"

    </>예시코드:

    # 문자열을 바이트로 인코딩 (encode)
    text = "한글"
    encoded = text.encode()
    print(encoded)
    # 출력: b'\xed\x95\x9c\xea\xb8\x80'
    # 설명:
    # - 문자열 "한글"을 컴퓨터가 이해할 수 있는 바이트 형태로 바꿈
    # - 앞의 b는 바이트라는 뜻 (binary data)
    # - 각 \x코드는 16진수로 표현된 문자 조각
    
    # 바이트를 다시 문자열로 디코딩 (decode)
    decoded = encoded.decode()
    print(decoded)
    # 출력: 한글
    # 설명:
    # - 위에서 인코딩한 바이트 데이터를 다시 사람이 읽을 수 있는 글자(문자열)로 변환
    # - 결과적으로 원래의 문자열과 동일해짐
    

    ◽ 인코딩 활용: 1️⃣ 파일 저장/읽기 텍스트를 파일에 저장할 때는 내부적으로 바이트로 인코딩됩니다. 다시 읽을 때는 디코딩하여 사람이 읽을 수 있는 글자로 변환합니다.

    2️⃣ 네트워크 통신 웹 서버나 API는 문자 대신 바이트 데이터를 주고받습니다. 데이터를 주고받을 때 인코딩/디코딩이 필수입니다.

    3️⃣ 암호화, 해시(Hash) 처리 전 문자열을 암호화하거나 해시할 때도 바이트로 인코딩해야 합니다.


    📖 용어설명:

    • 암호화(Encryption): 사람이 읽을 수 있는 데이터(평문)를 특정 규칙(알고리즘)에 따라 읽을 수 없게 변환(암호문)했다 다시 복원(decryption)할수 있는것

    • 해시 (Hash): 어떤 데이터를 넣으면, 고정된 길이의 고유한 요약 값(지문)을 만들어내는 함수

    • encode()는 문자열 → 바이트 (보낼 때, 저장할 때)

    • decode()는 바이트 → 문자열 (받을 때, 읽을 때)

    </> 예시코드:

    "hello" → 해시 → aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d...
    

    ◽ 해시는 어디에 사용되나요?

    • 비밀번호저장
    • 파일 무결성 검사
    • 블록체인 구조
    • 데이터 위변조 감지

    ◽ 기본 개념: 메서드 체이닝 (method chaining) "문자열".메서드( ).메서드( ) 처럼 연결해서 쓸수 있는것

    단, 앞 메서드의 결과가 다음 메서드를 쓸 수 있는 자료형이어야 합니다.
    예: 문자열 메서드끼리는 대부분 가능합니다.

    ❌ 예시 2: 불가능한 경우 (비문자열 반환)

    email = "user01@gmail.com"
    # 아래는 오류 발생
    # email.partition("@").lower()  ❌
    
    # 튜플 반환: ('user01', '@', 'gmail.com')
    

    🔍 이유:

    • partition("@")의 반환값은 튜플
    • 튜플에는 lower()가 없음 → 에러 발생

    ◽ 문자열 메서드 체이닝 조합

    • strip().lower()
      → 공백을 제거하고 소문자로 변환
    " Hello    ".strip().lower()  # 'hello'
    
    • strip().upper()
      → 공백 제거 후 대문자로 변환
    " Hi ".strip().upper()  # 'HI'
    
    • strip().capitalize()
      → 공백 제거 후 첫 글자만 대문자로
    " hello world ".strip().capitalize()  # 'Hello world'
    
    • strip().title()
      → 공백 제거 후 각 단어의 첫 글자를 대문자로
    " hello world ".strip().title()  # 'Hello World'
    
    • lower().replace("old", "new")
      → 소문자 변환 후 특정 단어 치환
    "HELLO Python".lower().replace("hello", "hi")  # 'hi python'
    
    • replace().strip()
      → 특정 문자를 제거하고 공백도 제거
    "@@test@@".replace("@", "").strip()  # 'test'
    
    • strip().split(",")
      → 공백 제거 후 쉼표 기준으로 리스트 분할
    " apple,banana ".strip().split(",")  # ['apple', 'banana']
    
    • replace().title()
      → 단어 변경 후 각 단어 첫 글자 대문자
    "hello_world".replace("_", " ").title()  # 'Hello World'
    

    ◽ 문자열 연결 방법 비교
    방법 설명 속도 용도 예시
    + 연산자 문자열끼리 직접 더함 느림 (많은 문자열 처리 시) 간단한 연결 "안녕" + "하세요"
    join() 함수 리스트나 튜플 안의 여러 문자열을 한 줄로 합침 빠름 (많은 문자열 처리 시 최적) 대량 문자열 연결 ", ".join(["a", "b", "c"])
    f-string 변수와 문자열을 함께 표현 빠름 포맷팅이 필요한 경우 f"이름: {name}"
    % 포맷팅 옛날 방식 포맷팅 느림 오래된 코드에서 사용 "이름: %s" % name
    .format() 포맷팅 함수 보통 Python 3의 대표 포맷팅 "이름: {}".format(name)

    1️⃣ + 연산자: 문자열끼리 직접 더함

    name = "영희"
    greeting = "안녕하세요, " + name + "입니다."
    print(greeting)
    

    🖨️ 출력:

    안녕하세요, 영희입니다.
    

    2️⃣ join() 함수: 여러개 문자열 데이터가 한개로 합쳐짐

    words = ["파이썬", "정말", "재미있다"]
    print(" ".join(words))
    

    🖨️ 출력:

    파이썬 정말 재미있다
    

    3️⃣ f-string: 변수와 문자열을 함께 표현

    name = "철수"
    age = 20
    print(f"{name}{age}살입니다.")
    

    🖨️ 출력:

    철수는 20살입니다.
    

    4️⃣ .format() 방식: {}를 사용해 문자열에 값을 넣는 방식

    template = "이름: {}, 나이: {}"
    print(template.format("지영", 22))
    

    🖨️ 출력:

    이름: 지영, 나이: 22
    

    5️⃣ % 포맷팅 방식: C 언어에서 유래한 오래된 방식

    name = "철수"
    age = 25
    print("이름: %s, 나이: %d" % (name, age))
    

    🧾 보충설명: 가독성이 떨어지도 느려서 현재 파이썬에서는 덜 권장되는 방식입니다.


    🔹 문자열과 in연산자

    in 연산자는 어떤 값이 포함되어 있는지 확인할 때 사용하는 연산자입니
    다. 문자열에서 in을 사용하면, 특정 문자가 포함되어 있는지 여부를 
    True 또는 False로 반환합니다.
    "a" in "apple" → True
    "z" in "apple" → False
    

    </> 예시코드: 문자열 포함 여부 확인

    	text = "Python is easy!"
    
    	print("Python" in text)
    	print("java" in text)
    

    🖨️ 출력결과:

    True 
    False
    

    🔍 해설:

    • "Python"이라는 단어가 text 안에 있으므로 → True
    • "java"는 없으므로 → False
    • ==대소문자를 구분==하므로 "python""Python"은 다릅니다!

    📝 문제1] 문자열 "Hello, Django!""Django"가 포함되어 있는지 확인하세요.

    msg = "Hello, Django!"
    print("Django" in msg)
    

    🖨️ 출력 결과:

    True
    

    📝 문제2] 사용자에게 입력받은 문장에 "love"가 포함되어 있는지 출력해보세요.

    🖨️ 출력 결과 (예시 입력: "I love Python"):

    love가 포함되어 있나요? True
    

    ✅ 정답 코드:

    sentence = input("문장을 입력하세요: ") 
    print("love가 포함되어 있나요?", "love" in sentence)
    

    🔍 해설:

    • 사용자가 입력한 문장 중 "love"라는 단어가 있으면 True, 없으면 False

    📝 문제3] 문자열 "DataScience""data"가 포함되어 있는지 확인하되, 대소문자 구분 없이 비교하세요. text = "DataScience"

    🖨️ 출력 결과:

    data가 포함되어 있나요? True
    

    ✅ 정답 코드:

    text = "DataScience" 
    print("data가 포함되어 있나요?", "data" in text.lower())
    

    🔍 해설: lower()를 사용해 문자열을 모두 소문자로 통일한 뒤, "data"가 포함되어 있는지 확인합니다.

    TOP
    preload preload